// 定义一个用来推导Promise<T>类型
export {}
// 推导Promise内的类型，由于内部还可能是 Promise<string | number>
// 使用infer R 定义一个不确定的值的泛型R
// 先判断T的类型，然后在判断R的类型，如果R还是Promise，则递归MyAwaited。
type MyAwaited<T extends Promise<any>> = 
    T extends Promise<infer R> ? 
    R extends Promise<any> ? 
    MyAwaited<R> : R : never;

type X = Promise<string>
type Y = Promise<{ field: number }>
type Z = Promise<Promise<string | number>>

type px = MyAwaited<X> // string;
type py = MyAwaited<Y> // { field: number };
type pz = MyAwaited<Z> // string | number;
